// 对落地页参数解析
// 处理了五种场景
// 1、入口参数带了cardId
// 2、入口参数没有scene
// 3、入口参数有scene
//  ·scene以wx_开始
//  ·scene以dist_开始
//  ·scene以notices_开始
//  ·否则scene就是cardId
// 其中以 /^(wx_|dist_|notices_)/ 开始的scene需要发送到后台解析进行

// sourceType 来源类型
// -1 来自服务通知
// 0 || null 其它 小于0 代表该来源类型不被用于雷达端feeds通知，不用于好友关系建立，因为在此之前好友关系已经建立，主要用于扩展后续来源跟踪统计
// 1 转发
// 2 扫码      scene=cardId
// 3 名片分发  scene=dist_|issue_后台配置
// 4 名片海报  scene=wx_ 前端生成海报
// 5 路径分发
// 6 搜索（推荐好友）
// 7 官网点击名片跳转
// 8 工作交接
// 9 优惠券
// 10 从落地页为详情页点击名片信息(如商品/动态/资讯/招聘等)跳转到名片首页
// 11 公众号推广
// 12 来自纸质名片
// 13 来自获客文章添加好友
// 14 来自名片首页同事推荐
// 15 来自好物圈
// 16 获客海报
// 17 动态海报
// 18 扫描获客文章小程序码
// 19 来自同事%s的评论
// 20 来自管理员的分配
// 21 来自拍名片
// 22 来自手动添加
// 23 公文包
// 24 H5产品手册
import Taro from "@tarojs/taro"
import apiUrl from './urls'
import { get, post } from './request/request'
import { envConfig } from './config/index'
import { handleStore } from "./init"
import { CARDID } from "../constants/card"

function getQrCodeType(scene) {
  if (/^issue_/.test(scene)) return -1 // 名片分发
  if (/^notices_/.test(scene)) return -2 // 服务通知消息群发
}

// 动态匹配落地页路径
function getRealPath(path, type) {
  const photoDynamicDetailPath = 'subs/dynamic/pages/dynamic-detail/dynamic-detail'
  switch (type) {
    case 0: // 名片
      return 'pages/tabbar/card/card'

    case 3: // 动态详情
      if (path !== photoDynamicDetailPath) { // 非图文动态详情
        return 'subs/website/pages/web-view/web-view'
      }
      break

    case 4: // 官网首页
      return 'pages/tabbar/website/website'

    case 5: // 产品首页
    case 6: // 商城首页
      return 'pages/tabbar/mall/mall'

    case 7: // 动态首页
      return 'pages/tabbar/dynamic/dynamic'

    case 8: // 表单
      return 'subs/activity/pages/activity-form-detail/activity-form-detail'
  }

  // 其他未匹配到的情景使用默认返回的路径
  return path
}

// 名片分发 或 服务通知群发
function getCardByDist(activityId, currentRoute) {
  return new Promise((resolve, reject) => {
    post(apiUrl.distributeParseUrl, { activityId }).then(res => {
      const { landPageUrl, landPageType, landPageParam, cardId } = res
      const path = getRealPath(landPageUrl, landPageType)
      const queryParams = {
        cardId,
        sourceType: 3,
        isShare: 1,
        activityId,
        landPageType,
        qrCodeType: getQrCodeType(activityId)
      }

      // 其他参数
      if (landPageParam) {
        landPageParam.split('&').forEach(item => {
          const [key, value] = item.split('=')
          if (value) queryParams[key] = value
        })
      }

      // 返回参数
      if (path === currentRoute) {
        resolve(queryParams)
        return
      }

      // 落地页非当前页面 跳转到真实落地页
      const qs = Object.keys(queryParams).map(key => `${key}=${queryParams[key]}`)
      Taro.reLaunch({
        url: `/${path}?${qs.join('&')}`
      })
      // eslint-disable-next-line prefer-promise-reject-errors
      reject({ msg: '名片分发当前路径与实际路径不匹配，即将跳转实际路径' })
    }, error => reject(error))
  })
}

// 名片二维码参数解析
function getCardByWX(sceneId) {
  return new Promise((resolve, reject) => {
    const formData = { sceneId: sceneId.replace('wx_', ''), companyId: envConfig.companyId }
    get(apiUrl.cardQrcodeParseWhtioutAuthUrl, formData, { withToken: false }).then(res => {
      const { extAttribute, ...params } = res
      const options = { ...(extAttribute || {}), ...params }

      // 纸质名片
      const sourceType = options.qrCodeType === 6 ? 12 : 2

      resolve({ sourceType, ...options })
    }, error => reject(error))
  })
}

function formatEntranceOptions(query, route) {
  const { scene } = query
  // 打开页面来源转发或者公众号 或 非入口（没有scene字段表示非入口，也有可能入口参数为cardId）
  // 无需换取新id 原始参数直接使用 如果是外部入口 参数必须带上 sourceType 字段，例如分享页面
  if (!scene) return Promise.resolve({ ...query })

  // 清除当前cardId缓存(热启动小程序会导致cardId被缓存)
  handleStore(CARDID,'')
  // 名片海报
  if (/^wx_/.test(scene)) return getCardByWX(scene)

  // 活动分发
  if (/^issue_|^notices_/.test(scene)) return getCardByDist(scene, route)

  return Promise.resolve({ ...query, cardId: scene })
}

export default formatEntranceOptions
